/**
 * 防抖函数
 * @param fn { Function } 函数
 * @param delay { number } 延迟时间，单位毫秒
 * @description 延迟一段时间后才会执行函数。若果在延迟时间内，再次触发函数，则将重新计时，确保始终是最后一次触发生效
 * @author meow
 * @example 若原函数为 fn(param)，则防抖后的函数为 const fnDebounce = debounce(fn,1000)，调用防抖后的函数：fnDebounce(param)
 * @return 防抖后的函数
 */
export const debounce = (fn: Function, delay: number): Function => {
  let timerId: number

  return function (this: any, ...args: any[]) {
    clearTimeout(timerId)
    timerId = setTimeout(() => {
      fn.apply(this, args)
    }, delay)
  }
}
